home *** CD-ROM | disk | FTP | other *** search
/ The World's Largest Collection of Windows Software / The World's Largest Collection of Windows Software - Disc 2.iso / win / pro207 / setup.in_ / setup.bin
Text File  |  1993-03-14  |  48KB  |  1,415 lines

  1. ''***************************************************************************
  2. ''                                        SETUPAPI.INC
  3. ''***************************************************************************
  4.  
  5. GLOBAL hSetup AS INTEGER
  6. GLOBAL fFrameInit AS INTEGER
  7. GLOBAL fInstallInit AS INTEGER
  8.  
  9. CONST SM_CXSCREEN = 0
  10. CONST SM_CYSCREEN = 1
  11.  
  12. CONST WF_80x87    = 1024
  13. CONST WF_CPU186   =  128
  14. CONST WF_CPU286   =    2
  15. CONST WF_CPU386   =    4
  16. CONST WF_CPU486   =    8
  17. CONST WF_STANDARD =   16
  18. CONST WF_ENHANCED =   32
  19.  
  20. CONST MB_OK          = 0
  21. CONST MB_ICONHAND    = 16
  22. CONST MB_TASKMODAL   = 8192
  23.  
  24. DECLARE FUNCTION DoMsgBox LIB "mscomstf.dll" (lpText$,lpCaption$,wType%) As INTEGER
  25. DECLARE FUNCTION GetWindowsDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
  26. DECLARE FUNCTION GetSystemDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
  27. DECLARE FUNCTION GetProfileString LIB "kernel" (szSect$, szKey$, szDefault$, szBuf$, cbBuf%) AS INTEGER
  28. DECLARE FUNCTION GetVersion LIB "kernel" AS INTEGER
  29. DECLARE FUNCTION GetSystemMetrics LIB "user" (nIndex%) AS INTEGER
  30. DECLARE FUNCTION GetWinFlags LIB "kernel" AS LONG
  31.  
  32. CONST cmoVital       = 1
  33. CONST cmoCopy        = 2
  34. CONST cmoUndo        = 4
  35. CONST cmoRoot        = 8
  36. CONST cmoDecompress  = 16
  37. CONST cmoTimeStamp   = 32
  38. CONST cmoReadOnly    = 64
  39. CONST cmoBackup      = 128
  40. CONST cmoForce       = 256
  41. CONST cmoRemove      = 512
  42. CONST cmoOverwrite   = 1024
  43. CONST cmoAppend      = 2048
  44. CONST cmoPrepend     = 4096
  45. CONST cmoNone        = 0
  46. CONST cmoAll         = 65535
  47.  
  48. CONST femExists     = 0
  49. CONST femRead       = 1
  50. CONST femWrite      = 2
  51. CONST femReadWrite  = 3
  52.  
  53. CONST ynrcNo         = 0
  54. CONST ynrcYes        = 1
  55. CONST ynrcErr1       = 2
  56. CONST ynrcErr2       = 3
  57. CONST ynrcErr3       = 4
  58. CONST ynrcErr4       = 5
  59. CONST ynrcErr5       = 6
  60. CONST ynrcErr6       = 7
  61. CONST ynrcErr7       = 8
  62. CONST ynrcErr8       = 9
  63. CONST ynrcErr9       = 10
  64.  
  65. CONST grcOkay       = 0
  66. CONST grcNotOkay    = 1
  67. CONST grcUserQuit   = 48
  68.  
  69. CONST cbSymValMax = 512
  70.  
  71. CONST STFERR      = 1024   ''setup system error
  72. CONST STFQUIT     = 1025   ''user quit
  73. CONST STFPROGMAN    = 32766     ''couldn't create Program Manager stuff
  74.  
  75. CONST scmOff      = 0
  76. CONST scmOnIgnore = 1
  77. CONST scmOnFatal  = 2
  78.  
  79. DECLARE FUNCTION FParseFATPathIntoPieces LIB "mscomstf.dll" (szPath$, szVol$, cbVol%, szDir$, cbDir%, szFile$, cbFile%) AS INTEGER
  80. DECLARE FUNCTION FOpenInf LIB "mscomstf.dll" (szFile$, fCheck%, fCheckSyms%) AS INTEGER
  81. DECLARE FUNCTION FSetSilent LIB "mscomstf.dll" (mode%) AS INTEGER
  82. DECLARE FUNCTION FSetBeepingMode LIB "mscomstf.dll" (mode%) AS INTEGER
  83. DECLARE FUNCTION HShowWaitCursor LIB "msshlstf.dll" AS INTEGER
  84. DECLARE FUNCTION FRestoreCursor  LIB "msshlstf.dll" (hPrev%) AS INTEGER
  85. DECLARE FUNCTION FOpenLogFile    LIB "mscomstf.dll" (szFile$, fAppend%) AS INTEGER
  86. DECLARE FUNCTION FCloseLogFile   LIB "mscomstf.dll" AS INTEGER
  87. DECLARE FUNCTION FWriteToLogFile LIB "mscomstf.dll" (sz$, fRequire%) AS INTEGER
  88. DECLARE FUNCTION CbGetInfSectionKeyField LIB "mscomstf.dll" (szSect$, szKey$, iField%, szBuf$, cbBuf%) AS INTEGER
  89. DECLARE FUNCTION FMakeListInfSectionField LIB "mscomstf.dll" (szSym$, szSect$, iField%) AS INTEGER
  90.  
  91. DECLARE FUNCTION PbSaveMemInf  LIB "mscomstf.dll" AS LONG
  92. DECLARE SUB      RestoreMemInf LIB "mscomstf.dll" (pb&)
  93. DECLARE SUB      FreeMemInf    LIB "mscomstf.dll" (pb&)
  94.  
  95. DECLARE FUNCTION FSetBitmap LIB "msshlstf.dll" (szDll$, Bitmap%) AS INTEGER
  96. DECLARE FUNCTION FSetAbout LIB "msshlstf.dll" (szAbout1$, szAbout2$) AS INTEGER
  97. DECLARE FUNCTION FDoDialogExt LIB "msuilstf.dll" (hwnd%, szDll$, Dlg%, szDlgProc$, szHelpDll$, HelpDlg%, szHelpProc$) AS INTEGER
  98. DECLARE FUNCTION FKillNDialogs LIB "msuilstf.dll" (n%) AS INTEGER
  99. DECLARE SUB SetWindowText LIB "User" (hwnd%, lpString$)
  100. DECLARE FUNCTION FSetSymbolValue LIB "msshlstf.dll" (szSymbol$, szValue$) AS INTEGER
  101. DECLARE FUNCTION FRemoveSymbol LIB "mscomstf.dll" (szSym$) AS INTEGER
  102. DECLARE FUNCTION CbGetSymbolValue LIB "mscomstf.dll" (szSymbol$, szValue$, Length%) AS INTEGER
  103. DECLARE FUNCTION UsGetListLength LIB "mscomstf.dll" (szSymbol$) AS INTEGER
  104. DECLARE FUNCTION CbGetListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$, cbMax%) AS INTEGER
  105. DECLARE FUNCTION FAddListItem LIB "mscomstf.dll" (szListSymbol$, szListItem$) AS INTEGER
  106. DECLARE FUNCTION FReplaceListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$) AS INTEGER
  107. DECLARE FUNCTION FSetSymbolToListOfInfKeys LIB "mscomstf.dll" (szSym$, szSect$, fNulls%) AS INTEGER
  108.  
  109. DECLARE FUNCTION InitializeFrame LIB "msshlstf.dll" (szCmdLine$) AS INTEGER
  110. DECLARE FUNCTION HwndFrame LIB "msshlstf.dll" AS INTEGER
  111. DECLARE FUNCTION HinstFrame LIB "msshlstf.dll" AS INTEGER
  112.  
  113. DECLARE SUB      ProSetPos LIB "msinsstf.dll" (x%, y%)
  114. DECLARE FUNCTION FCreateDir LIB "msinsstf.dll" (szDir$, cmo%) AS INTEGER
  115. DECLARE FUNCTION FRemoveDir LIB "msinsstf.dll" (szDir$, cmo%) AS INTEGER
  116. DECLARE FUNCTION FAddSectionFilesToCopyList LIB "mscomstf.dll" (szSect$, szSrc$, szDest$) AS INTEGER
  117. DECLARE FUNCTION FAddSectionKeyFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
  118. DECLARE FUNCTION FAddSpecialFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
  119. DECLARE FUNCTION GrcCopyFilesInCopyList LIB "msinsstf.dll" (hInstance%) AS INTEGER
  120. DECLARE FUNCTION FRemoveIniSection LIB "msinsstf.dll" (szFile$, szSect$, cmo%) AS INTEGER
  121. DECLARE FUNCTION FCreateIniKeyValue LIB "msinsstf.dll" (szFile$, szSect$, szKey$, szValue$, cmo%) AS INTEGER
  122. DECLARE FUNCTION FRemoveIniKey LIB "msinsstf.dll" (szFile$, szSect$, szKey$, cmo%) AS INTEGER
  123. DECLARE FUNCTION FCreateSysIniKeyValue LIB "msinsstf.dll" (szFile$, szSect$, szKey$, szValue$, cmo%) AS INTEGER
  124. DECLARE FUNCTION FCreateProgManGroup LIB "msinsstf.dll" (szGroup$, szPath$, cmo%) AS INTEGER
  125. DECLARE FUNCTION FCreateProgManItem LIB "msinsstf.dll" (szGroup$, szItem$, szCmd$, cmo%) AS INTEGER
  126. DECLARE FUNCTION FShowProgManGroup LIB "msinsstf.dll" (szGroup$, szCmd$, cmo%) AS INTEGER
  127. DECLARE FUNCTION FStampResource LIB "msinsstf.dll" (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%) AS INTEGER
  128. DECLARE FUNCTION FDumpCopyListToFile LIB "msinsstf.dll" (szFile$) AS INTEGER
  129. DECLARE SUB      ResetCopyList LIB "msinsstf.dll"
  130. DECLARE FUNCTION LcbGetCopyListCost LIB "msinsstf.dll" (szExtraList$, szCostList$, szNeedList$) AS LONG
  131. DECLARE FUNCTION FAddDos5Help LIB "msinsstf.dll" (szProgName$, szProgHelp$, cmo%) AS INTEGER
  132. DECLARE FUNCTION FCopyOneFile LIB "msinsstf.dll" (szSrc$, szDest$, cmo%, fAppend%) AS INTEGER
  133. DECLARE FUNCTION YnrcRemoveFile LIB "msinsstf.dll" (szFullPathSrc$, cmo%) AS INTEGER
  134. DECLARE FUNCTION YnrcBackupFile LIB "msinsstf.dll" (szFullPath$, szBackup$, cmo%) AS INTEGER
  135. DECLARE FUNCTION FInitializeInstall LIB "msinsstf.dll" (hinst%, hwndFrame%) AS INTEGER
  136. DECLARE FUNCTION WFindFileUsingFileOpen LIB "msinsstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  137. DECLARE FUNCTION FIsDirWritable LIB "msinsstf.dll" (szDir$) AS INTEGER
  138. DECLARE FUNCTION FIsFileWritable LIB "msinsstf.dll" (szFile$) AS INTEGER
  139. DECLARE FUNCTION FAddToBillboardList LIB "msinsstf.dll" (szDll$, idDlg%, szProc$, lTicks&) AS INTEGER
  140. DECLARE FUNCTION FClearBillboardList LIB "msinsstf.dll" AS INTEGER
  141. DECLARE FUNCTION FSetRestartDir LIB "msinsstf.dll" (szDir$) AS INTEGER
  142. DECLARE FUNCTION FRestartListEmpty LIB "msinsstf.dll" AS INTEGER
  143. DECLARE FUNCTION FExitExecRestart LIB "msinsstf.dll" AS INTEGER
  144. DECLARE FUNCTION SetCopyMode LIB "msinsstf.dll" (fMode%) AS INTEGER
  145. DECLARE FUNCTION GetCopyMode LIB "msinsstf.dll" AS INTEGER
  146. DECLARE FUNCTION SetDecompMode LIB "msinsstf.dll" (fMode%) AS INTEGER
  147. DECLARE FUNCTION GetDecompMode LIB "msinsstf.dll" AS INTEGER
  148. DECLARE FUNCTION SetSizeCheckMode LIB "msinsstf.dll" (scmMode%) AS INTEGER
  149. DECLARE FUNCTION FPrependToPath LIB "msinsstf.dll" (szSrc$, szDst$, szDir$, cmo%) AS INTEGER
  150.  
  151. DECLARE FUNCTION SetTimeValue LIB "msinsstf.dll" (usHours%, usMinutes%, usSeconds%) AS INTEGER
  152. DECLARE SUB ForceRestartOn LIB "msinsstf.dll"
  153.  
  154. DECLARE SUB SetBitmap(szDll$, Bitmap%)
  155. DECLARE SUB SetAbout(szAbout1$, szAbout2$)
  156. DECLARE FUNCTION UIStartDlgExt(szDll$, Dlg%, szDlgProc$, szHelpDll$, HelpDlg%, szHelpProc$) AS STRING
  157. DECLARE FUNCTION UIStartDlg(szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) AS STRING
  158. DECLARE SUB UIPop (n%)
  159. DECLARE SUB UIPopAll
  160. DECLARE SUB SetTitle (sz$)
  161. DECLARE SUB ReadInfFile (szFile$)
  162. DECLARE SUB SetSymbolValue (szSymbol$, szValue$)
  163. DECLARE SUB RemoveSymbol (szSym$)
  164. DECLARE FUNCTION GetSymbolValue (szSymbol$) AS STRING
  165. DECLARE FUNCTION GetListLength(szSymbol$) AS INTEGER
  166. DECLARE SUB MakeListFromSectionKeys (szSymbol$, szSect$)
  167. DECLARE FUNCTION GetListItem(szSymbol$, n%) AS STRING
  168. DECLARE SUB AddListItem(szSymbol$, szItem$)
  169. DECLARE SUB ReplaceListItem(szSymbol$, n%, szItem$)
  170.  
  171. DECLARE FUNCTION InitFrame (szCmdLine$) AS INTEGER
  172. DECLARE FUNCTION InitSetup (szCmdLine$) AS INTEGER
  173.  
  174. DECLARE FUNCTION ShowWaitCursor AS INTEGER
  175. DECLARE SUB RestoreCursor (hPrev%)
  176.  
  177. DECLARE FUNCTION SetBeepingMode (mode%) AS INTEGER
  178. DECLARE FUNCTION SetSilentMode (mode%) AS INTEGER
  179.  
  180. DECLARE FUNCTION GetSectionKeyDate (szSect$, szKey$) AS STRING
  181. DECLARE FUNCTION GetSectionKeyFilename (szSect$, szKey$) AS STRING
  182. DECLARE FUNCTION GetSectionKeySize (szSect$, szKey$) AS LONG
  183. DECLARE FUNCTION GetSectionKeyVersion (szSect$, szKey$) AS STRING
  184.  
  185. DECLARE SUB MakeListFromSectionDate (szSym$, szSect$)
  186. DECLARE SUB MakeListFromSectionFilename (szSym$, szSect$)
  187. DECLARE SUB MakeListFromSectionSize (szSym$, szSect$)
  188. DECLARE SUB MakeListFromSectionVersion (szSym$, szSect$)
  189.  
  190. DECLARE SUB CreateDir (szDir$, cmo%)
  191. DECLARE SUB RemoveDir (szDir$, cmo%)
  192. DECLARE SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
  193. DECLARE SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  194. DECLARE SUB AddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  195. DECLARE SUB CopyFilesInCopyList
  196. DECLARE SUB RemoveIniSection (szFile$, szSect$, cmo%)
  197. DECLARE SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%)
  198. DECLARE SUB RemoveIniKey (szFile$, szSect$, szKey$, cmo%)
  199. DECLARE SUB CreateSysIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%)
  200. DECLARE SUB CreateProgmanGroup (szGroup$, szPath$, cmo%)
  201. DECLARE SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%)
  202. DECLARE SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%)
  203. DECLARE SUB StampResource (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%)
  204. DECLARE SUB DumpCopyList (szFile$)
  205. DECLARE SUB ClearCopyList
  206. DECLARE FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
  207. DECLARE SUB AddDos5Help (szProgName$, szProgHelp$, cmo%)
  208. DECLARE SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%)
  209. DECLARE SUB RemoveFile (szFullPathSrc$, cmo%)
  210. DECLARE SUB BackupFile (szFullPath$, szBackup$)
  211. DECLARE SUB RenameFile (szFullPath$, szBackup$)
  212. DECLARE SUB InitInstall
  213. DECLARE SUB AddToBillboardList (szDll$, idDlg%, szProc$, lTicks&)
  214. DECLARE SUB AddBlankToBillboardList (lTicks&)
  215. DECLARE SUB ClearBillboardList
  216. DECLARE SUB OpenLogFile (szFile$, fAppend%)
  217. DECLARE SUB CloseLogFile
  218. DECLARE SUB WriteToLogFile (szStr$)
  219. DECLARE SUB SetCopyGaugePosition (x%, y%)
  220. DECLARE SUB SetRestartDir(szDir$)
  221. DECLARE FUNCTION RestartListEmpty AS INTEGER
  222. DECLARE FUNCTION ExitExecRestart AS INTEGER
  223. DECLARE FUNCTION FindFileUsingFileOpen (szFile$) AS STRING
  224. DECLARE FUNCTION IsDirWritable (szDir$) AS INTEGER
  225. DECLARE FUNCTION IsFileWritable (szFile$) AS INTEGER
  226. DECLARE FUNCTION GetNthFieldFromIniString (szLine$, iField%) AS STRING
  227. DECLARE SUB PrependToPath (szSrc$, szDst$, szDir$, cmo%)
  228.  
  229. DECLARE FUNCTION GetWindowsMajorVersion AS INTEGER
  230. DECLARE FUNCTION GetWindowsMinorVersion AS INTEGER
  231. DECLARE FUNCTION GetWindowsMode AS INTEGER
  232. DECLARE FUNCTION GetWindowsDir  AS STRING
  233. DECLARE FUNCTION GetWindowsSysDir AS STRING
  234. DECLARE FUNCTION IsWindowsShared AS INTEGER
  235. DECLARE FUNCTION GetScreenWidth AS INTEGER
  236. DECLARE FUNCTION GetScreenHeight AS INTEGER
  237.  
  238.  
  239. FUNCTION InitSetup(szCmdLine$) STATIC AS INTEGER
  240.     fFrameInit = 0
  241.     fInstallInit = 0
  242.  
  243.     IF hSetup > 0 THEN
  244.     END IF
  245.  
  246.     i% = InitFrame(szCmdLine$)
  247.     fFrameInit = 1
  248.  
  249.     InitInstall
  250.     fInstallInit = 1
  251.  
  252.     InitSetup = i%
  253. END FUNCTION
  254.  
  255. FUNCTION InitFrame(szCmdLine$) STATIC AS INTEGER
  256.     IF hSetup > 0 THEN
  257.     ELSE
  258.         i% = InitializeFrame(szCmdLine$)
  259.         IF i% = -1 THEN
  260.             END   '' NOT an error - Usage (/?) or Command line copy operation
  261.         ELSEIF i% = 0 THEN
  262.             END
  263.         ELSE
  264.             InitFrame = i%
  265.         END IF
  266.     END IF
  267. END FUNCTION
  268.  
  269. SUB SetBitmap(szDll$, Bitmap%) STATIC
  270.     IF FSetBitmap(szDll$, Bitmap%) = 0 THEN
  271.         ERROR STFERR
  272.     END IF
  273. END SUB
  274.  
  275. SUB SetAbout(szAbout1$, szAbout2$) STATIC
  276.     IF FSetAbout(szAbout1$, szAbout2$) = 0 THEN
  277.         ERROR STFERR
  278.     END IF
  279. END SUB
  280.  
  281. SUB SetTitle(sz$) STATIC
  282.     SetWindowText HwndFrame(), sz$
  283. END SUB
  284.  
  285. SUB ReadInfFile (szFile$) STATIC
  286.     IF FOpenInf(szFile$, 1, 0) = 0 THEN
  287.         ERROR STFERR
  288.     END IF
  289. END SUB
  290.  
  291. FUNCTION UIStartDlg(szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) STATIC AS STRING
  292.     IF FDoDialogExt(HwndFrame(), szDll$, Dlg%, szDlgProc$, szDll$, HelpDlg%, szHelpProc$) = 0 THEN
  293.         ERROR STFERR
  294.     ELSE
  295.         UIStartDlg = GetSymbolValue("DLGEVENT")
  296.     END IF
  297. END FUNCTION
  298.  
  299.  
  300. FUNCTION UIStartDlgExt(szDll$, Dlg%, szDlgProc$, szHelpDll$, HelpDlg%, szHelpProc$) STATIC AS STRING
  301.     IF FDoDialogExt(HwndFrame(), szDll$, Dlg%, szDlgProc$, szHelpDll$, HelpDlg%, szHelpProc$) = 0 THEN
  302.         ERROR STFERR
  303.     ELSE
  304.         UIStartDlgExt = GetSymbolValue("DLGEVENT")
  305.     END IF
  306. END FUNCTION
  307.  
  308.  
  309. SUB UIPop (n%) STATIC
  310.     IF FKillNDialogs(n%) = 0 THEN
  311.         ERROR STFERR
  312.     END IF
  313. END SUB
  314.  
  315. SUB UIPopAll STATIC
  316.     IF FKillNDialogs(65535) = 0 THEN
  317.         ERROR STFERR
  318.     END IF
  319. END SUB
  320.  
  321.  
  322. FUNCTION GetSymbolValue(szSymbol$) STATIC AS STRING
  323.     szValue$ = string$(cbSymValMax,32)
  324.     Length% = CbGetSymbolValue(szSymbol$, szValue$, cbSymValMax)
  325.     GetSymbolValue = szValue$
  326.     IF Length% >= cbSymValMax THEN
  327.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  328.         ERROR STFERR
  329.     END IF
  330.     IF szSymbol$ = "" THEN
  331.         ERROR STFERR
  332.     END IF
  333.     szValue$ = ""
  334. END FUNCTION
  335.  
  336.  
  337. FUNCTION GetListLength(szSymbol$) STATIC AS INTEGER
  338.     GetListLength = UsGetListLength(szSymbol$)
  339.     IF szSymbol$ = "" THEN
  340.         ERROR STFERR
  341.     END IF
  342. END FUNCTION
  343.  
  344.  
  345. FUNCTION GetListItem(szListSymbol$, nItem%) STATIC AS STRING
  346.     szListItem$ = string$(cbSymValMax,32)
  347.     Length% = CbGetListItem(szListSymbol$, nItem%, szListItem$, cbSymValMax)
  348.     GetListItem = szListItem$
  349.     IF Length% >= cbSymValMax THEN
  350.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  351.         ERROR STFERR
  352.     END IF
  353.     IF szListSymbol$ = "" THEN
  354.         ERROR STFERR
  355.     END IF
  356.     if nItem% <= 0 or nItem% > GetListLength(szListSymbol$) then
  357.         ERROR STFERR
  358.     end if
  359.     szListItem$ = ""
  360. END FUNCTION
  361.  
  362.  
  363. SUB AddListItem(szSymbol$, szItem$) STATIC
  364.     IF FAddListItem(szSymbol$, szItem$) = 0 THEN
  365.         ERROR STFERR
  366.     END IF
  367. END SUB
  368.  
  369.  
  370. SUB ReplaceListItem(szSymbol$, n%, szItem$) STATIC
  371.     IF FReplaceListItem(szSymbol$, n%, szItem$) = 0 THEN
  372.         ERROR STFERR
  373.     END IF
  374. END SUB
  375.  
  376. SUB MakeListFromSectionKeys(szSymbol$, szSect$) STATIC
  377.     IF FSetSymbolToListOfInfKeys(szSymbol$, szSect$, 1) = 0 THEN
  378.         ERROR STFERR
  379.     END IF
  380. END SUB
  381.  
  382.  
  383. SUB SetSymbolValue(szSymbol$, szValue$) STATIC
  384.     IF FSetSymbolValue(szSymbol$, szValue$) = 0 THEN
  385.         ERROR STFERR
  386.     END IF
  387. END SUB
  388.  
  389. SUB RemoveSymbol(szSym$) STATIC
  390.     IF FRemoveSymbol(szSym$) = 0 THEN
  391.         ERROR STFERR
  392.     END IF
  393. END SUB
  394.  
  395. FUNCTION ShowWaitCursor STATIC AS INTEGER
  396.     ShowWaitCursor = HShowWaitCursor
  397. END FUNCTION
  398.  
  399. SUB RestoreCursor (hPrev%) STATIC
  400.     i% = FRestoreCursor(hPrev%)
  401.     IF i% = 0 THEN
  402.         ERROR STFERR
  403.     END IF
  404. END SUB
  405.  
  406. FUNCTION SetBeepingMode (mode%) STATIC AS INTEGER
  407.     SetBeepingMode = FSetBeepingMode(mode%)
  408. END FUNCTION
  409.  
  410. FUNCTION SetSilentMode (mode%) STATIC AS INTEGER
  411.     SetSilentMode = FSetSilent(mode%)
  412. END FUNCTION
  413.  
  414. FUNCTION GetSectionKeyDate (szSect$, szKey$) STATIC AS STRING
  415.     szBuf$ = string$(128, 32)
  416.     Length% = CbGetInfSectionKeyField(szSect$, szKey$, 5, szBuf$, 128)
  417.     IF Length% >= 128 THEN
  418.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  419.         ERROR STFERR
  420.     END IF
  421.  
  422.     IF Length% = -1 THEN
  423.         ERROR STFERR
  424.     END IF
  425.  
  426.     GetSectionKeyDate = szBuf$
  427.     szBuf$ = ""
  428. END FUNCTION
  429.  
  430.  
  431. FUNCTION GetSectionKeyFilename (szSect$, szKey$) STATIC AS STRING
  432.     szBuf$ = string$(128, 32)
  433.     Length% = CbGetInfSectionKeyField(szSect$, szKey$, 1, szBuf$, 128)
  434.     IF Length% >= 128 THEN
  435.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  436.         ERROR STFERR
  437.     END IF
  438.  
  439.     IF Length% = -1 THEN
  440.         ERROR STFERR
  441.     END IF
  442.  
  443.     GetSectionKeyFilename = szBuf$
  444.     szBuf$ = ""
  445. END FUNCTION
  446.  
  447.  
  448. FUNCTION GetSectionKeySize (szSect$, szKey$) STATIC AS LONG
  449.     szBuf$ = string$(128, 32)
  450.     Length% = CbGetInfSectionKeyField(szSect$, szKey$, 15, szBuf$, 128)
  451.     IF Length% >= 128 THEN
  452.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  453.         ERROR STFERR
  454.     END IF
  455.  
  456.     IF Length% = -1 THEN
  457.         ERROR STFERR
  458.     END IF
  459.  
  460.     GetSectionKeySize = VAL(szBuf$)
  461.     szBuf$ = ""
  462. END FUNCTION
  463.  
  464.  
  465. FUNCTION GetSectionKeyVersion (szSect$, szKey$) STATIC AS STRING
  466.     szBuf$ = string$(128, 32)
  467.     Length% = CbGetInfSectionKeyField(szSect$, szKey$, 19, szBuf$, 128)
  468.     IF Length% >= 128 THEN
  469.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  470.         ERROR STFERR
  471.     END IF
  472.  
  473.     IF Length% = -1 THEN
  474.         ERROR STFERR
  475.     END IF
  476.  
  477.     GetSectionKeyVersion = szBuf$
  478.     szBuf$ = ""
  479. END FUNCTION
  480.  
  481.  
  482. SUB MakeListFromSectionDate (szSym$, szSect$) STATIC
  483.     IF FMakeListInfSectionField(szSym$, szSect$, 5) = 0 THEN
  484.         ERROR STFERR
  485.     END IF
  486. END SUB
  487.  
  488. SUB MakeListFromSectionFilename (szSym$, szSect$) STATIC
  489.     IF FMakeListInfSectionField(szSym$, szSect$, 1) = 0 THEN
  490.         ERROR STFERR
  491.     END IF
  492. END SUB
  493.  
  494. SUB MakeListFromSectionSize (szSym$, szSect$) STATIC
  495.     IF FMakeListInfSectionField(szSym$, szSect$, 15) = 0 THEN
  496.         ERROR STFERR
  497.     END IF
  498. END SUB
  499.  
  500. SUB MakeListFromSectionVersion (szSym$, szSect$) STATIC
  501.     IF FMakeListInfSectionField(szSym$, szSect$, 19) = 0 THEN
  502.         ERROR STFERR
  503.     END IF
  504. END SUB
  505.  
  506. SUB InitInstall STATIC
  507.     IF hSetup > 0 THEN
  508.     ELSEIF FInitializeInstall(HinstFrame(), HwndFrame()) = 0 THEN
  509.         END
  510.     END IF
  511. END SUB
  512.  
  513. SUB CreateDir (szDir$, cmo%) STATIC
  514.     IF FCreateDir(szDir$, cmo%) = 0 THEN
  515.         ERROR STFERR
  516.     END IF
  517. END SUB
  518.  
  519. SUB RemoveDir (szDir$, cmo%) STATIC
  520.     IF FRemoveDir(szDir$, cmo%) = 0 THEN
  521.         ERROR STFERR
  522.     END IF
  523. END SUB
  524.  
  525. SUB RemoveIniSection (szFile$, szSect$, cmo%) STATIC
  526.     IF FRemoveIniSection(szFile$, szSect$, cmo%) = 0 THEN
  527.         ERROR STFERR
  528.     END IF
  529. END SUB
  530.  
  531. SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%) STATIC
  532.     IF FCreateIniKeyValue(szFile$, szSect$, szKey$, szValue$, cmo%) = 0 THEN
  533.         ERROR STFERR
  534.     END IF
  535. END SUB
  536.  
  537. SUB RemoveIniKey (szFile$, szSect$, szKey$, cmo%) STATIC
  538.     IF FRemoveIniKey(szFile$, szSect$, szKey$, cmo%) = 0 THEN
  539.         ERROR STFERR
  540.     END IF
  541. END SUB
  542.  
  543. SUB CreateSysIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%) STATIC
  544.     IF FCreateSysIniKeyValue(szFile$, szSect$, szKey$, szValue$, cmo%) = 0 THEN
  545.         ERROR STFERR
  546.     END IF
  547. END SUB
  548.  
  549. SUB CreateProgmanGroup (szGroup$, szPath$, cmo%) STATIC
  550.     IF FCreateProgManGroup(szGroup$, szPath$, cmo%) = 0 THEN
  551.         ERROR STFPROGMAN
  552.     END IF
  553. END SUB
  554.  
  555. SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%) STATIC
  556.     IF FShowProgManGroup(szGroup$, STR$(Cmd%), cmo%) = 0 THEN
  557.         ERROR STFPROGMAN
  558.     END IF
  559. END SUB
  560.  
  561. SUB StampResource (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%) STATIC
  562.     IF FStampResource (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%) = 0 THEN
  563.         ERROR STFERR
  564.     END IF
  565. END SUB
  566.  
  567. SUB DumpCopyList (szFile$) STATIC
  568.     IF FDumpCopyListToFile (szFile$) = 0 THEN
  569.         ERROR STFERR
  570.     END IF
  571. END SUB
  572.  
  573. SUB ClearCopyList STATIC
  574.     ResetCopyList
  575. END SUB
  576.  
  577. FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) STATIC AS LONG
  578.     lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
  579.     IF lNeed& < 0 THEN
  580.         ERROR STFERR
  581.     END IF
  582.     GetCopyListCost = lNeed&
  583. END FUNCTION
  584.  
  585. SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%) STATIC
  586.     szItemNew$ = szItem$
  587.     IF szOther$ <> "" THEN
  588.         szItemNew$ = szItem$ + "," + szOther$
  589.     END IF
  590.  
  591.     IF FCreateProgManItem(szGroup$, szItemNew$, szCmd$, cmo%) = 0 THEN
  592.         ERROR STFPROGMAN
  593.     END IF
  594.     szItemNew$ = ""
  595. END SUB
  596.  
  597. SUB AddDos5Help (szProgName$, szProgHelp$, cmo%) STATIC
  598.     IF FAddDos5Help (szProgName$, szProgHelp$, cmo%) = 0 THEN
  599.         ERROR STFERR
  600.     END IF
  601. END SUB
  602.  
  603. SUB CopyFilesInCopyList STATIC
  604.     grc% = GrcCopyFilesInCopyList (HinstFrame())
  605.  
  606.     IF grc% = grcUserQuit THEN
  607.         ERROR STFQUIT
  608.     ELSEIF grc% > 0 THEN
  609.         ERROR STFERR
  610.     END IF
  611. END SUB
  612.  
  613. SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%) STATIC
  614.     IF  FCopyOneFile(szFullPathSrc$, szFullPathDst$, (cmo OR cmoCopy), fAppend%) = 0 THEN
  615.         ERROR STFERR
  616.     END IF
  617. END SUB
  618.  
  619. SUB RemoveFile (szFullPathSrc$, cmo%) STATIC
  620.     IF  YnrcRemoveFile(szFullPathSrc$, cmo%) = ynrcNo THEN
  621.         ERROR STFERR
  622.     END IF
  623. END SUB
  624.  
  625. SUB BackupFile (szFullPath$, szBackup$) STATIC
  626.     IF YnrcBackupFile(szFullPath$, szBackup$, cmoNone) = ynrcNo THEN
  627.         ERROR STFERR
  628.     END IF
  629. END SUB
  630.  
  631. SUB RenameFile (szFullPath$, szBackup$) STATIC
  632.     IF YnrcBackupFile(szFullPath$, szBackup$, cmoNone) = ynrcNo THEN
  633.         ERROR STFERR
  634.     END IF
  635. END SUB
  636.  
  637. SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) STATIC
  638.     IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  639.         ERROR STFERR
  640.     END IF
  641. END SUB
  642.  
  643. SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) STATIC
  644.     IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  645.         ERROR STFERR
  646.     END IF
  647. END SUB
  648.  
  649. SUB AddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$) STATIC
  650.     IF FAddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  651.         ERROR STFERR
  652.     END IF
  653. END SUB
  654.  
  655.  
  656. SUB AddToBillboardList (szDll$, idDlg%, szProc$, lTicks&) STATIC
  657.     IF FAddToBillboardList(szDll$, idDlg%, szProc$, lTicks&) = 0 THEN
  658.         ERROR STFERR
  659.     END IF
  660. END SUB
  661.  
  662. SUB AddBlankToBillboardList (lTicks&) STATIC
  663.     IF FAddToBillboardList(NULL, 0, NULL, lTicks&) = 0 THEN
  664.         ERROR STFERR
  665.     END IF
  666. END SUB
  667.  
  668. SUB ClearBillboardList STATIC
  669.     IF FClearBillboardList = 0 THEN
  670.         ERROR STFERR
  671.     END IF
  672. END SUB
  673.  
  674. SUB OpenLogFile (szFile$, fAppend%) STATIC
  675.     IF FOpenLogFile(szFile$, fAppend%) = 0 THEN
  676.         ERROR STFERR
  677.     END IF
  678. END SUB
  679.  
  680. SUB CloseLogFile STATIC
  681.     IF FCloseLogFile() = 0 THEN
  682.         ERROR STFERR
  683.     END IF
  684. END SUB
  685.  
  686. SUB WriteToLogFile (szStr$) STATIC
  687.     IF FWriteToLogFile(szStr$, 1) = 0 THEN
  688.         ERROR STFERR
  689.     END IF
  690. END SUB
  691.  
  692. SUB SetCopyGaugePosition (x%, y%) STATIC
  693.     ProSetPos x%, y%
  694. END SUB
  695.  
  696. FUNCTION FindFileUsingFileOpen (szFile$) STATIC AS STRING
  697.     szBuf$ = STRING$(512, 32)
  698.  
  699.     wRet% = WFindFileUsingFileOpen(szFile$, szBuf$, len(szBuf$))
  700.     IF wRet% = 0 THEN
  701.         FindFileUsingFileOpen = szBuf$
  702.     ELSEIF wRet% = 1 THEN
  703.         FindFileUsingFileOpen = ""
  704.     ELSE
  705.         ERROR STFERR
  706.     END IF
  707.  
  708.     szBuf$ = ""
  709. END FUNCTION
  710.  
  711. FUNCTION IsDirWritable (szDir$) STATIC AS INTEGER
  712.     IsDirWritable = FIsDirWritable(szDir$)
  713. END FUNCTION
  714.  
  715. FUNCTION IsFileWritable (szFile$) STATIC AS INTEGER
  716.     IsFileWritable = FIsFileWritable(szFile$)
  717. END FUNCTION
  718.  
  719. FUNCTION GetNthFieldFromIniString (szLine$, iField%) STATIC AS STRING
  720.     IF iField% < 1 THEN
  721.         ERROR STFERR
  722.     END IF
  723.     szStart$ = szLine$
  724.     IF iField% <> 1 THEN
  725.         FOR i% = 2 TO iField% STEP 1
  726.             iNew% = INSTR(szStart$, ",")
  727.             IF iNew% = 0 THEN
  728.                 GetNthFieldFromIniString = ""
  729.                 GOTO _GNFFIS_END
  730.             END IF
  731.             szStart$ = MID$(szStart$, (iNew% + 1))
  732.         NEXT
  733.     END IF
  734.  
  735.     iNew% = INSTR(szStart$, ",")
  736.     IF iNew% <> 0 THEN
  737.         szStart$ = MID$(szStart$, 1, (iNew% - 1))
  738.     END IF
  739.  
  740.     GetNthFieldFromIniString = LTRIM$(RTRIM$(szStart$))
  741.  
  742. _GNFFIS_END:
  743.  
  744. END FUNCTION
  745.  
  746. FUNCTION GetWindowsMajorVersion STATIC AS INTEGER
  747.     GetWindowsMajorVersion = GetVersion() MOD 256
  748. END FUNCTION
  749.  
  750. FUNCTION GetWindowsMinorVersion STATIC AS INTEGER
  751.     GetWindowsMinorVersion = GetVersion() / 256
  752. END FUNCTION
  753.  
  754. FUNCTION GetWindowsMode STATIC AS INTEGER
  755.     GetWindowsMode = 0
  756.     longTmp& = GetWinFlags()
  757.     IF longTmp& AND WF_STANDARD THEN
  758.         GetWindowsMode = 1
  759.     ELSEIF longTmp& AND WF_ENHANCED THEN
  760.         GetWindowsMode = 2
  761.     END IF
  762. END FUNCTION
  763.  
  764. FUNCTION GetWindowsDir STATIC AS STRING
  765.     szBuf$ = string$(256, 32)
  766.     cbBuf% = GetWindowsDirectory(szBuf$, 256)
  767.  
  768.     IF cbBuf% = 0 THEN
  769.         GetWindowsDir = ""
  770.         ERROR STFERR
  771.     ELSE
  772.         IF cbBuf% > 255 THEN
  773.             res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  774.             ERROR STFERR
  775.         END IF
  776.         szBuf$ = RTRIM$(szBuf$)
  777.         IF MID$(szBuf$, 1, 1) = "\" THEN
  778.             'szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  779.             szBuf$ = MID$(GetWindowsSysDir, 1, 2) + szBuf$
  780.         ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  781.             szBuf$ = MID$(GetWindowsSysDir, 1, 3) + szBuf$
  782.         END IF
  783.         IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  784.             szBuf$ = szBuf$ + "\"
  785.         END IF
  786.         GetWindowsDir = szBuf$
  787.     END IF
  788.  
  789.     szBuf$ = ""
  790. END FUNCTION
  791.  
  792. FUNCTION GetWindowsSysDir STATIC AS STRING
  793.     szBuf$ = string$(256, 32)
  794.     cbBuf% = GetSystemDirectory(szBuf$, 256)
  795.  
  796.     IF cbBuf% = 0 THEN
  797.         ERROR STFERR
  798.     ELSE
  799.         IF cbBuf% > 255 THEN
  800.             res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  801.             ERROR STFERR
  802.         END IF
  803.         szBuf$ = RTRIM$(szBuf$)
  804.         IF MID$(szBuf$, 1, 1) = "\" THEN
  805.             szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  806.         ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  807.             szBuf$ = MID$(CURDIR$, 1, 3) + szBuf$
  808.         END IF
  809.         IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  810.             szBuf$ = szBuf$ + "\"
  811.         END IF
  812.         GetWindowsSysDir = szBuf$
  813.     END IF
  814.  
  815.     szBuf$ = ""
  816. END FUNCTION
  817.  
  818. FUNCTION IsWindowsShared STATIC AS INTEGER
  819.     szWin$ = UCASE$(GetWindowsDir())
  820.     szSys$ = UCASE$(GetWindowsSysDir())
  821.  
  822.     IF len(szWin$) = 0 THEN
  823.         ERROR STFERR
  824.     END IF
  825.  
  826.     IF len(szSys$) <= len(szWin$) THEN
  827.         IsWindowsShared = 1
  828.     ELSE
  829.         szSys$ = MID$(szSys$, 1, len(szWin$))
  830.         IF szWin$ = szSys$ THEN
  831.             IsWindowsShared = 0
  832.         ELSE
  833.             IsWindowsShared = 1
  834.         END IF
  835.     END IF
  836. END FUNCTION
  837.  
  838. FUNCTION GetScreenWidth STATIC AS INTEGER
  839.     GetScreenWidth = GetSystemMetrics(SM_CXSCREEN)
  840. END FUNCTION
  841.  
  842. FUNCTION GetScreenHeight STATIC AS INTEGER
  843.     GetScreenHeight = GetSystemMetrics(SM_CYSCREEN)
  844. END FUNCTION
  845.  
  846. SUB SetRestartDir (szDir$) STATIC
  847.     IF FSetRestartDir(szDir$) = 0 THEN
  848.         ERROR STFERR
  849.     END IF
  850. END SUB
  851.  
  852.  
  853. FUNCTION RestartListEmpty STATIC AS INTEGER
  854.     IF FRestartListEmpty() = 0 THEN
  855.         RestartListEmpty = 0
  856.     ELSE
  857.         RestartListEmpty = 1
  858.     END IF
  859. END FUNCTION
  860.  
  861. FUNCTION ExitExecRestart STATIC AS INTEGER
  862.     ExitExecRestart = FExitExecRestart
  863. END FUNCTION
  864.  
  865. SUB PrependToPath (szSrc$, szDst$, szDir$, cmo%) STATIC
  866.     IF FPrependToPath (szSrc$, szDst$, szDir$, cmo%) = 0 THEN
  867.         ERROR STFERR
  868.     END IF
  869. END SUB
  870.  
  871. TRAP CleanupTrap From "MSSHLSTF.DLL"
  872.  
  873. End Trap
  874.  
  875. hSetup = InitSetup(COMMAND$)
  876.  
  877. ON ERROR GOTO QUIT
  878.  
  879. ''***************************************************************************
  880. ''                                        MSREGDB.INC
  881. ''***************************************************************************
  882.  
  883. '$DEFINE REG_DB_ENABLED
  884.  
  885. const REG_SZ               = 1
  886. const HKEY_CLASSES_ROOT    = 1
  887. const ERROR_SUCCESS        = 0
  888.  
  889.  
  890. DECLARE FUNCTION EercErrorHandler LIB "mscomstf.dll" (grc%, fVital%, sz1$, sz2$, sz3$) AS INTEGER
  891. CONST GRC_API_FAILED       = 104
  892.  
  893. DECLARE FUNCTION RegOpenKey LIB "SHELL.DLL" (hKey&, szSubKey$, phkResult AS POINTER TO LONG) AS LONG
  894. DECLARE FUNCTION RegCreateKey LIB "shell.dll" (hKey&, szSubKey$, phkResult AS POINTER TO LONG) AS LONG
  895. DECLARE FUNCTION RegDeleteKey LIB "shell.dll" (hKey&, szSubKey$) AS LONG
  896. DECLARE FUNCTION RegCloseKey LIB "shell.dll" (hKey&) AS LONG
  897. DECLARE FUNCTION RegQueryValue LIB "shell.dll" (hKey&, szSubKey$, szValue$, lpcb AS POINTER TO LONG) AS LONG
  898. DECLARE FUNCTION RegSetValue LIB "shell.dll" (hKey&, szSubKey$, dwType&, szValue$, cbValue&) AS LONG
  899. DECLARE FUNCTION RegEnumKey LIB "shell.dll" (HkEY&, dwIndex&, szBuffer$, dwBufferSize&) AS LONG
  900.  
  901.  
  902. DECLARE SUB CreateRegKey(szKey$)
  903. DECLARE SUB CreateRegKeyValue(szKey$, szValue$)
  904. DECLARE SUB SetRegKeyValue(szKey$, szValue$)
  905. DECLARE SUB DeleteRegKey(szKey$)
  906. DECLARE FUNCTION GetRegKeyValue(szKey$) AS STRING
  907. DECLARE FUNCTION DoesRegKeyExist(szKey$) AS INTEGER
  908.  
  909. SUB CreateRegKey(szKey$) STATIC
  910.     DIM phKey AS LONG
  911.  
  912.     IF RegCreateKey(HKEY_CLASSES_ROOT, szKey$, VARPTR(phKey)) > ERROR_SUCCESS THEN
  913.         i% = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKey", NULL, NULL)
  914.         ERROR STFERR
  915.     END IF
  916.  
  917.     IF RegCloseKey(phKey) > ERROR_SUCCESS THEN
  918.         i% = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKey", NULL, NULL)
  919.         ERROR STFERR
  920.     END IF
  921. END SUB
  922.  
  923. SUB CreateRegKeyValue(szKey$, szValue$) STATIC
  924.     DIM phKey AS LONG
  925.  
  926.     IF RegSetValue(HKEY_CLASSES_ROOT, szKey$, REG_SZ,  szValue$, len(szKey$)) > ERROR_SUCCESS THEN
  927.         i% = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyValue", NULL, NULL)
  928.         ERROR STFERR
  929.     END IF
  930. END SUB
  931.  
  932. FUNCTION DoesRegKeyExist(szKey$) STATIC AS INTEGER
  933.     DIM phKey AS LONG
  934.  
  935.     IF RegOpenKey(HKEY_CLASSES_ROOT, szKey$, VARPTR(phKey)) = ERROR_SUCCESS THEN
  936.         i = RegCloseKey(phKey)
  937.         DoesRegKeyExist = 1
  938.     ELSE
  939.         DoesRegKeyExist = 0
  940.     ENDIF
  941. END FUNCTION
  942.  
  943.  
  944. SUB SetRegKeyValue(szKey$, szValue$) STATIC
  945.     DIM phKey AS LONG
  946.  
  947.     IF RegSetValue(HKEY_CLASSES_ROOT, szKey$, REG_SZ,  szValue$, len(szKey$)) > ERROR_SUCCESS THEN
  948.         i% = EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValue", NULL, NULL)
  949.         ERROR STFERR
  950.     END IF
  951. END SUB
  952.  
  953.  
  954. FUNCTION GetRegKeyValue(szKey$) STATIC AS STRING
  955.     szValue$ = string$(512,32)
  956.     cb& = len(szValue$)
  957.  
  958.     IF DoesRegKeyExist(szKey$) = 0 THEN
  959.         GetRegKeyValue = ""
  960.         EXIT FUNCTION
  961.     END IF
  962.  
  963.     IF RegQueryValue(HKEY_CLASSES_ROOT, szKey$, szValue$, VARPTR(cb)) = ERROR_SUCCESS THEN
  964.         GetRegKeyValue = MID$(szValue$, 1, cb)
  965.     ELSE
  966.         i% = EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValue", NULL, NULL)
  967.         ERROR STFERR
  968.     END IF
  969.     szValue$ = ""
  970. END FUNCTION
  971.  
  972.  
  973. SUB DeleteRegKey(szKey$) STATIC
  974.     i& = RegDeleteKey(HKEY_CLASSES_ROOT, szKey$)
  975. END SUB
  976.  
  977.  
  978. ''***************************************************************************
  979. ''                                        MSDETECT.INC
  980. ''***************************************************************************
  981.  
  982. DECLARE FUNCTION CbGetVersionOfFile LIB "msdetstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  983. DECLARE FUNCTION LGetVersionNthField LIB "msdetstf.dll" (szVersion$, nField%) AS LONG
  984. DECLARE FUNCTION LcbGetSizeOfFile LIB "msdetstf.dll" (szFile$) AS LONG
  985. DECLARE FUNCTION FGetValidDrivesList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  986. DECLARE FUNCTION FGetLocalHardDrivesList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  987. DECLARE FUNCTION FGetRemovableDrivesList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  988. DECLARE FUNCTION FGetNetworkDrivesList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  989. DECLARE FUNCTION LcbTotalDrive LIB "msdetstf.dll" (nDrive%) AS LONG
  990. DECLARE FUNCTION LcbFreeDrive LIB "msdetstf.dll" (nDrive%) AS LONG
  991. DECLARE FUNCTION FIsValidDrive LIB "msdetstf.dll" (nDrive%) AS INTEGER
  992. DECLARE FUNCTION FIsLocalHardDrive LIB "msdetstf.dll" (nDrive%) AS INTEGER
  993. DECLARE FUNCTION FIsRemoveDrive LIB "msdetstf.dll" (nDrive%) AS INTEGER
  994. DECLARE FUNCTION FIsRemoteDrive LIB "msdetstf.dll" (nDrive%) AS INTEGER
  995. DECLARE FUNCTION FDirExists LIB "msdetstf.dll" (szDir$) AS INTEGER
  996. DECLARE FUNCTION FDoesFileExist LIB "msdetstf.dll" (szFileName$, mode%) AS INTEGER
  997. DECLARE FUNCTION CbGetDateOfFile LIB "msdetstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  998. DECLARE FUNCTION FDoesIniSectionExist LIB "msdetstf.dll" (szFile$, szSect$) AS INTEGER
  999. DECLARE FUNCTION FDoesIniKeyExist LIB "msdetstf.dll" (szFile$, szSect$, szKey$) AS INTEGER
  1000. DECLARE FUNCTION CbGetIniKeyString LIB "msdetstf.dll" (szFile$, szSect$, szKey$, szBuf$, cbBuf%) AS INTEGER
  1001. DECLARE FUNCTION WGetDOSMajorVersion LIB "msdetstf.dll" AS INTEGER
  1002. DECLARE FUNCTION WGetDOSMinorVersion LIB "msdetstf.dll" AS INTEGER
  1003. DECLARE FUNCTION CbGetEnvVariableValue LIB "msdetstf.dll" (szEnvVar$, szBuf$, cbBuf%) AS INTEGER
  1004. DECLARE FUNCTION WGetNumWinApps LIB "msdetstf.dll" AS INTEGER
  1005. DECLARE FUNCTION FGetParallelPortsList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  1006. DECLARE FUNCTION FGetSerialPortsList LIB "msdetstf.dll" (szSymbol$) AS INTEGER
  1007. DECLARE FUNCTION FHas87MathChip LIB "msdetstf.dll" AS INTEGER
  1008. DECLARE FUNCTION FHasMonochromeDisplay LIB "msdetstf.dll" AS INTEGER
  1009. DECLARE FUNCTION FHasMouseInstalled LIB "msdetstf.dll" AS INTEGER
  1010. DECLARE FUNCTION WGetConfigSmartdrvSize LIB "msdetstf.dll" AS INTEGER
  1011. DECLARE FUNCTION WGetConfigRamdriveSize LIB "msdetstf.dll" AS INTEGER
  1012. DECLARE FUNCTION WGetConfigNumBuffers LIB "msdetstf.dll" AS INTEGER
  1013. DECLARE FUNCTION WGetConfigNumFiles LIB "msdetstf.dll" AS INTEGER
  1014. DECLARE FUNCTION WGetConfigLastDrive LIB "msdetstf.dll" AS INTEGER
  1015. DECLARE FUNCTION FIsDriverInConfig LIB "msdetstf.dll" (szDrv$) AS INTEGER
  1016. DECLARE FUNCTION CbFindTargetOnEnvVar LIB "msdetstf.dll" (szFile$, szEnvVar$, szBuf$, cbBuf%) AS INTEGER
  1017. DECLARE FUNCTION CbFindFileInTree LIB "msdetstf.dll" (szFile$, szDir$, szBuf$, cbBuf%) AS INTEGER
  1018. DECLARE FUNCTION GetTypeFaceNameFromTTF LIB "msdetstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  1019. DECLARE FUNCTION GetExistingFOTFileForTTF LIB "msdetstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  1020.  
  1021. DECLARE FUNCTION IsDriveValid (szDrive$) AS INTEGER
  1022. DECLARE FUNCTION IsDriveLocalHard (szDrive$) AS INTEGER
  1023. DECLARE FUNCTION IsDriveRemovable (szDrive$) AS INTEGER
  1024. DECLARE FUNCTION IsDriveNetwork (szDrive$) AS INTEGER
  1025. DECLARE SUB GetValidDrivesList (szSymbol$)
  1026. DECLARE SUB GetLocalHardDrivesList (szSymbol$)
  1027. DECLARE SUB GetRemovableDrivesList (szSymbol$)
  1028. DECLARE SUB GetNetworkDrivesList (szSymbol$)
  1029. DECLARE FUNCTION GetTotalSpaceForDrive (szDrive$) AS LONG
  1030. DECLARE FUNCTION GetFreeSpaceForDrive (szDrive$) AS LONG
  1031.  
  1032. DECLARE FUNCTION GetDOSMajorVersion AS INTEGER
  1033. DECLARE FUNCTION GetDOSMinorVersion AS INTEGER
  1034. DECLARE FUNCTION GetEnvVariableValue (szEnvVar$) AS STRING
  1035. DECLARE FUNCTION GetNumWinApps AS INTEGER
  1036.  
  1037. DECLARE FUNCTION DoesFileExist (szFile$, mode%) AS INTEGER
  1038. DECLARE FUNCTION GetDateOfFile (szFile$) AS STRING
  1039. DECLARE FUNCTION GetYearFromDate (szDate$) AS INTEGER
  1040. DECLARE FUNCTION GetMonthFromDate (szDate$) AS INTEGER
  1041. DECLARE FUNCTION GetDayFromDate (szDate$) AS INTEGER
  1042. DECLARE FUNCTION GetHourFromDate (szDate$) AS INTEGER
  1043. DECLARE FUNCTION GetMinuteFromDate (szDate$) AS INTEGER
  1044. DECLARE FUNCTION GetSecondFromDate (szDate$) AS INTEGER
  1045. DECLARE FUNCTION GetVersionOfFile (szFile$) AS STRING
  1046. DECLARE FUNCTION GetVersionNthField (szVersion$, nField%) AS LONG
  1047. DECLARE FUNCTION GetSizeOfFile (szFile$) AS LONG
  1048. DECLARE FUNCTION FindTargetOnEnvVar (szFile$, szEnvVar$) AS STRING
  1049. DECLARE FUNCTION FindFileInTree (szFile$, szDir$) AS STRING
  1050. DECLARE FUNCTION DoesDirExist (szDir$) AS INTEGER
  1051.  
  1052. DECLARE FUNCTION DoesIniSectionExist (szFile$, szSect$) AS INTEGER
  1053. DECLARE FUNCTION DoesIniKeyExist (szFile$, szSect$, szKey$) AS INTEGER
  1054. DECLARE FUNCTION GetIniKeyString (szFile$, szSect$, szKey$) AS STRING
  1055.  
  1056. DECLARE FUNCTION GetConfigSmartdrvSize AS INTEGER
  1057. DECLARE FUNCTION GetConfigRamdriveSize AS INTEGER
  1058. DECLARE FUNCTION GetConfigNumBuffers AS INTEGER
  1059. DECLARE FUNCTION GetConfigNumFiles AS INTEGER
  1060. DECLARE FUNCTION GetConfigLastDrive AS STRING
  1061. DECLARE FUNCTION IsDriverInConfig (szDrv$) AS INTEGER
  1062.  
  1063. DECLARE FUNCTION GetProcessorType AS INTEGER
  1064. DECLARE SUB GetParallelPortsList (szSymbol$)
  1065. DECLARE SUB GetSerialPortsList (szSymbol$)
  1066. DECLARE FUNCTION Has87MathChip AS INTEGER
  1067. DECLARE FUNCTION HasMonochromeDisplay AS INTEGER
  1068. DECLARE FUNCTION HasMouseInstalled AS INTEGER
  1069.  
  1070.  
  1071. FUNCTION IsDriveValid (szDrive$) STATIC  AS INTEGER
  1072.     IsDriveValid = FIsValidDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1073. END FUNCTION
  1074.  
  1075. FUNCTION IsDriveLocalHard (szDrive$) STATIC  AS INTEGER
  1076.     IsDriveLocalHard = FIsLocalHardDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1077. END FUNCTION
  1078.  
  1079. FUNCTION IsDriveRemovable (szDrive$) STATIC  AS INTEGER
  1080.     IsDriveRemovable = FIsRemoveDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1081. END FUNCTION
  1082.  
  1083. FUNCTION IsDriveNetwork (szDrive$) STATIC  AS INTEGER
  1084.     IsDriveNetwork = FIsRemoteDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1085. END FUNCTION
  1086.  
  1087. FUNCTION GetTotalSpaceForDrive (szDrive$) STATIC  AS LONG
  1088.     GetTotalSpaceForDrive = LcbTotalDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1089. END FUNCTION
  1090.  
  1091. FUNCTION GetFreeSpaceForDrive (szDrive$) STATIC  AS LONG
  1092.     GetFreeSpaceForDrive = LcbFreeDrive(ASC(UCASE$(szDrive$)) - ASC("A") + 1)
  1093. END FUNCTION
  1094.  
  1095. SUB GetValidDrivesList (szSymbol$) STATIC
  1096.     if FGetValidDrivesList(szSymbol$) = 0 then
  1097.         ERROR STFERR
  1098.     end if
  1099. END SUB
  1100.  
  1101. SUB GetLocalHardDrivesList (szSymbol$) STATIC
  1102.     if FGetLocalHardDrivesList(szSymbol$) = 0 then
  1103.         ERROR STFERR
  1104.     end if
  1105. END SUB
  1106.  
  1107. SUB GetRemovableDrivesList (szSymbol$) STATIC
  1108.     if FGetRemovableDrivesList(szSymbol$) = 0 then
  1109.         ERROR STFERR
  1110.     end if
  1111. END SUB
  1112.  
  1113. SUB GetNetworkDrivesList (szSymbol$) STATIC
  1114.     if FGetNetworkDrivesList(szSymbol$) = 0 then
  1115.         ERROR STFERR
  1116.     end if
  1117. END SUB
  1118.  
  1119. FUNCTION GetDOSMajorVersion STATIC  AS INTEGER
  1120.     GetDOSMajorVersion = WGetDOSMajorVersion
  1121. END FUNCTION
  1122.  
  1123. FUNCTION GetDOSMinorVersion STATIC  AS INTEGER
  1124.     GetDOSMinorVersion = WGetDOSMinorVersion
  1125. END FUNCTION
  1126.  
  1127. FUNCTION GetEnvVariableValue (szEnvVar$) STATIC  AS STRING
  1128.     cb% = 1024
  1129.     szBuf$ = STRING$(cb%, 32)
  1130.     cbRet% = CbGetEnvVariableValue(szEnvVar$, szBuf$, cb%)
  1131.     GetEnvVariableValue = szBuf$
  1132.     szBuf$ = ""
  1133. END FUNCTION
  1134.  
  1135. FUNCTION GetNumWinApps STATIC  AS INTEGER
  1136.     GetNumWinApps = WGetNumWinApps
  1137. END FUNCTION
  1138.  
  1139. FUNCTION DoesFileExist (szFileName$, mode%) STATIC  AS INTEGER
  1140.     DoesFileExist = FDoesFileExist(szFileName$, mode%)
  1141. END FUNCTION
  1142.  
  1143. FUNCTION GetDateOfFile (szFile$) STATIC  AS STRING
  1144.     cb% = 20
  1145.     szBuf$ = STRING$(cb%, 32)
  1146.     cbRet% = CbGetDateOfFile(szFile$, szBuf$, cb%)
  1147.     GetDateOfFile = szBuf$
  1148.     szBuf$ = ""
  1149. END FUNCTION
  1150.  
  1151. FUNCTION GetYearFromDate (szDate$) STATIC  AS INTEGER
  1152.     GetYearFromDate = VAL(MID$(szDate$, 1, 4))
  1153. END FUNCTION
  1154.  
  1155. FUNCTION GetMonthFromDate (szDate$) STATIC  AS INTEGER
  1156.     GetMonthFromDate = VAL(MID$(szDate$, 6, 2))
  1157. END FUNCTION
  1158.  
  1159. FUNCTION GetDayFromDate (szDate$) STATIC  AS INTEGER
  1160.     GetDayFromDate = VAL(MID$(szDate$, 9, 2))
  1161. END FUNCTION
  1162.  
  1163. FUNCTION GetHourFromDate (szDate$) STATIC  AS INTEGER
  1164.     GetHourFromDate = VAL(MID$(szDate$, 12, 2))
  1165. END FUNCTION
  1166.  
  1167. FUNCTION GetMinuteFromDate (szDate$) STATIC  AS INTEGER
  1168.     GetMinuteFromDate = VAL(MID$(szDate$, 15, 2))
  1169. END FUNCTION
  1170.  
  1171. FUNCTION GetSecondFromDate (szDate$) STATIC  AS INTEGER
  1172.     GetSecondFromDate = VAL(MID$(szDate$, 18, 2))
  1173. END FUNCTION
  1174.  
  1175. FUNCTION GetVersionOfFile (szFile$) STATIC  AS STRING
  1176.     cb% = 30
  1177.     szBuf$ = STRING$(cb%, 32)
  1178.     cbRet% = CbGetVersionOfFile(szFile$, szBuf$, cb%)
  1179.     GetVersionOfFile = szBuf$
  1180.     szBuf$ = ""
  1181. END FUNCTION
  1182.  
  1183. FUNCTION GetVersionNthField (szVersion$, nField%) STATIC  AS LONG
  1184.     GetVersionNthField = LGetVersionNthField(szVersion$, nField%)
  1185. END FUNCTION
  1186.  
  1187. FUNCTION GetSizeOfFile (szFile$) STATIC  AS LONG
  1188.     GetSizeOfFile = LcbGetSizeOfFile(szFile$)
  1189. END FUNCTION
  1190.  
  1191. FUNCTION FindTargetOnEnvVar (szFile$, szEnvVar$) STATIC  AS STRING
  1192.     cb% = 512
  1193.     szBuf$ = STRING$(cb%, 32)
  1194.     cbRet% = CbFindTargetOnEnvVar(szFile$, szEnvVar$, szBuf$, cb%)
  1195.     IF cbRet% >= cb% THEN
  1196.         ERROR STFERR
  1197.     END IF
  1198.     szBuf$ = RTRIM$(szBuf$)
  1199.     IF MID$(szBuf$, 1, 1) = "\" THEN
  1200.        szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  1201.     ELSEIF Len(szBuf$) > 0 AND MID$(szBuf$, 2, 1) <> ":" THEN
  1202.        szBuf$ = MID$(CURDIR$, 1, 3) + szBuf$
  1203.     END IF
  1204.     FindTargetOnEnvVar = szBuf$
  1205.     szBuf$ = ""
  1206. END FUNCTION
  1207.  
  1208. FUNCTION FindFileInTree (szFile$, szDir$) STATIC  AS STRING
  1209.     cb% = 512
  1210.     szBuf$ = STRING$(cb%, 32)
  1211.     cbRet% = CbFindFileInTree(szFile$, szDir$, szBuf$, cb%)
  1212.     FindFileInTree = szBuf$
  1213.     szBuf$ = ""
  1214. END FUNCTION
  1215.  
  1216. FUNCTION GetConfigSmartdrvSize STATIC  AS INTEGER
  1217.     GetConfigSmartdrvSize = WGetConfigSmartdrvSize
  1218. END FUNCTION
  1219.  
  1220. FUNCTION GetConfigRamdriveSize STATIC  AS INTEGER
  1221.     GetConfigRamdriveSize = WGetConfigRamdriveSize
  1222. END FUNCTION
  1223.  
  1224. FUNCTION GetConfigNumBuffers STATIC  AS INTEGER
  1225.     GetConfigNumBuffers = WGetConfigNumBuffers
  1226. END FUNCTION
  1227.  
  1228.  
  1229. FUNCTION GetConfigNumFiles STATIC  AS INTEGER
  1230.     GetConfigNumFiles = WGetConfigNumFiles
  1231. END FUNCTION
  1232.  
  1233. FUNCTION GetConfigLastDrive STATIC  AS STRING
  1234.     chRet% = WGetConfigLastDrive
  1235.     if chRet% = 0 then
  1236.         GetConfigLastDrive = ""
  1237.     else
  1238.         GetConfigLastDrive = CHR$(chRet%)
  1239.     end if
  1240. END FUNCTION
  1241.  
  1242. FUNCTION IsDriverInConfig (szDrv$) STATIC  AS INTEGER
  1243.     IsDriverInConfig = FIsDriverInConfig(szDrv$)
  1244. END FUNCTION
  1245.  
  1246. FUNCTION GetProcessorType STATIC  AS INTEGER
  1247.     GetProcessorType = 0
  1248.     longTmp& = GetWinFlags()
  1249.     IF longTmp& AND WF_CPU486 THEN
  1250.         GetProcessorType = 4
  1251.     ELSEIF longTmp& AND WF_CPU386 THEN
  1252.         GetProcessorType = 3
  1253.     ELSEIF longTmp& AND WF_CPU286 THEN
  1254.         GetProcessorType = 2
  1255.     ELSEIF longTmp& AND WF_CPU186 THEN
  1256.         GetProcessorType = 1
  1257.     END IF
  1258. END FUNCTION
  1259.  
  1260. SUB GetParallelPortsList (szSymbol$) STATIC
  1261.     if FGetParallelPortsList(szSymbol$) = 0 then
  1262.         ERROR STFERR
  1263.     end if
  1264. END SUB
  1265.  
  1266. SUB GetSerialPortsList (szSymbol$) STATIC
  1267.     if FGetSerialPortsList(szSymbol$) = 0 then
  1268.         ERROR STFERR
  1269.     end if
  1270. END SUB
  1271.  
  1272. FUNCTION Has87MathChip STATIC  AS INTEGER
  1273.     Has87MathChip = FHas87MathChip
  1274. END FUNCTION
  1275.  
  1276. FUNCTION HasMonochromeDisplay STATIC  AS INTEGER
  1277.     HasMonochromeDisplay = FHasMonochromeDisplay
  1278. END FUNCTION
  1279.  
  1280. FUNCTION HasMouseInstalled STATIC  AS INTEGER
  1281.     HasMouseInstalled = FHasMouseInstalled
  1282. END FUNCTION
  1283.  
  1284. FUNCTION DoesDirExist (szDir$) STATIC  AS INTEGER
  1285.     DoesDirExist = FDirExists(szDir$)
  1286. END FUNCTION
  1287.  
  1288. FUNCTION DoesIniSectionExist (szFile$, szSect$) STATIC  AS INTEGER
  1289.     DoesIniSectionExist = FDoesIniSectionExist(szFile$, szSect$)
  1290. END FUNCTION
  1291.  
  1292. FUNCTION DoesIniKeyExist (szFile$, szSect$, szKey$) STATIC  AS INTEGER
  1293.     DoesIniKeyExist = FDoesIniKeyExist(szFile$, szSect$, szKey$)
  1294. END FUNCTION
  1295.  
  1296. FUNCTION GetIniKeyString (szFile$, szSect$, szKey$) STATIC  AS STRING
  1297.     cb% = 512
  1298.     szBuf$ = STRING$(cb%, 32)
  1299.     cbRet% = CbGetIniKeyString(szFile$, szSect$, szKey$, szBuf$, cb%)
  1300.     GetIniKeyString = szBuf$
  1301.     szBuf$ = ""
  1302. END FUNCTION
  1303.  
  1304. ''***************************************************************************
  1305. ''                                        MSSHARED.INC
  1306. ''***************************************************************************
  1307.  
  1308. GLOBAL SharedFileNeedsCopying AS INTEGER
  1309.  
  1310. DECLARE FUNCTION WCompareVersion (szVer1$, szVer2$) AS INTEGER
  1311.  
  1312. DECLARE FUNCTION FindSharedFileFromPath (szField$, szVersion$) AS STRING
  1313.  
  1314. DECLARE FUNCTION SearchForLocationForSharedFile (szRegDbKey$, szWinIniSect$, szWinIniKey$, iWinIniField%, szDefault$, szVersion$) AS STRING
  1315.  
  1316.  
  1317. FUNCTION WCompareVersion (szVer1$, szVer2$) STATIC AS INTEGER
  1318.     IF szVer1$ = "" THEN
  1319.         IF szVer2$ = "" THEN
  1320.             WCompareVersion = 0
  1321.         ELSE
  1322.             WCompareVersion = -1
  1323.         END IF
  1324.     ELSEIF szVer2$ = "" THEN
  1325.         WCompareVersion = 1
  1326.     ELSE
  1327.         WCompareVersion = 0
  1328.         FOR i% = 1 TO 4 STEP 1
  1329.             piece1& = GetVersionNthField(szVer1$, i%)
  1330.             piece2& = GetVersionNthField(szVer2$, i%)
  1331.             IF piece1& > piece2& THEN
  1332.                 WCompareVersion = 1
  1333.                 GOTO _WCV_END
  1334.             ELSEIF piece1& < piece2& THEN
  1335.                 WCompareVersion = -1
  1336.                 GOTO _WCV_END
  1337.             END IF
  1338.         NEXT i%
  1339.     END IF
  1340. _WCV_END:
  1341. END FUNCTION
  1342.  
  1343. FUNCTION FindSharedFileFromPath(szField$, szVersion$) STATIC AS STRING
  1344.     FindSharedFileFromPath = ""
  1345.     SharedFileNeedsCopying = 0
  1346.     IF szField$ <> "" THEN
  1347.         IF DoesFileExist(szField$, OF_EXIST) = 0 THEN
  1348.             szFile$ = STRING$(32, 32)
  1349.  
  1350.             IF FParseFATPathIntoPieces(szField$, NULL, 0, NULL, 0, szFile$, 31) <> 0 THEN
  1351.                 szField$ = FindFileUsingFileOpen(szFile$)
  1352.             ELSE
  1353.                 szField$ = ""
  1354.             END IF
  1355.             szFile$ = ""
  1356.         END IF
  1357.  
  1358.         IF szField$ <> "" THEN
  1359.             IF WCompareVersion(GetVersionOfFile(szField$), szVersion$) >= 0 THEN
  1360.                 FindSharedFileFromPath = szField$
  1361.             ELSEIF IsFileWritable(szField$) <> 0 THEN
  1362.                 SharedFileNeedsCopying = 1
  1363.                 FindSharedFileFromPath = szField$
  1364.             END IF
  1365.  
  1366.             szField$ = ""
  1367.         END IF
  1368.     END IF
  1369. END FUNCTION
  1370.  
  1371.  
  1372. FUNCTION SearchForLocationForSharedFile (szRegDbKey$, szWinIniSect$, szWinIniKey$, iWinIniField%, szDefault$, szVersion$) STATIC AS STRING
  1373.  
  1374.     SearchForLocationForSharedFile = szDefault$
  1375.  
  1376. '$IFDEF    REG_DB_ENABLED
  1377.     IF szRegDbKey$ <> "" THEN
  1378.         szField$ = GetRegKeyValue(szRegDbKey$)
  1379.         szFile$ = FindSharedFileFromPath(szField$, szVersion$)
  1380.         IF szFile$ <> "" THEN
  1381.             SearchForLocationForSharedFile = szFile$
  1382.             szFile$ = ""
  1383.             GOTO _SFLSFS_END
  1384.         END IF
  1385.     END IF
  1386. '$ENDIF '' REG_DB_ENABLED
  1387.  
  1388.     IF szWinIniSect$ <> "" AND szWinIniKey$ <> "" THEN
  1389.         szWinIniLine$ = GetIniKeyString("WIN.INI", szWinIniSect$, szWinIniKey$)
  1390.         IF szWinIniLine$ <> "" THEN
  1391.             szField$ = GetNthFieldFromIniString(szWinIniLine$, iWinIniField%)
  1392.             szWinIniLine$ = ""
  1393.             szFile$ = FindSharedFileFromPath(szField$, szVersion$)
  1394.             IF szFile$ <> "" THEN
  1395.                 SearchForLocationForSharedFile = szFile$
  1396.                 szFile$ = ""
  1397.                 GOTO _SFLSFS_END
  1398.             END IF
  1399.         END IF
  1400.     END IF
  1401.  
  1402.     '' return value is still szDefault$ - assume it is writable
  1403.     SharedFileNeedsCopying = 1
  1404.     IF DoesFileExist(szDefault$, OF_EXIST) <> 0 THEN
  1405.         IF WCompareVersion(GetVersionOfFile(szDefault$), szVersion$) >= 0 THEN
  1406.             SharedFileNeedsCopying = 0
  1407.         END IF
  1408.     END IF
  1409.  
  1410. _SFLSFS_END:
  1411.  
  1412. END FUNCTION
  1413.  
  1414.  
  1415.